#!/usr/bin/env python 
# -*- coding:UTF-8 -*-
#本片段主要是类的属性的实践代码

#Python的类的属性，可以分为实例属性，类属性

#尽量把需要用户传入的属性，作为实例属性；把同类都一样的属性作为类属性。

class YunweiNoteA(object):
    #__init__,类的构造方法，主要用于类的实例化对象初始化.
    #如以下代码,当没有yunweinote001 = YunweiNoteA()这一句实例化代码时，则不会执行;而实例化对象yunweinote001之后，则会执行这条语句.
    #同理，__init__模块的代码，可以进行类的属性的初始化.
    def __init__(self):
        #该语句只会在实例化类之后执行，而单独执行类时，不会执行
        print("I am class YunweiNote's __init__.")
yunweinote001 = YunweiNoteA() #此时可以执行__init__ 函数中的print()函数

# 类的属性可以随便定义，如下:
yunweinote001.name = "yunweinote001"
yunweinote001.age = 28
print("yunweinote001.name is %s , yunweinote001.age is %d" % (yunweinote001.name,yunweinote001.age))

# 通过__init__函数，进行实例属性的初始化，比如name这个实例属性
class YunweiNoteB(object):
    #构造函数__init__通过传给自己的参数name，赋值给self.name
    #当实例化类时，对象则具有了该属性值
    def __init__(self,name):
        self.name = name
        print("YunweinoteB's __init__.self.name = %s " % self.name)
#yunweinote002 = YunweiNoteB() #这样实例化一个对象是错误的，因为未给对象一个实例化的属性值
yunweinote002 = YunweiNoteB("yunweinote002") #这句代码会执行self.name = name的操作，并且执行print()函数
print(yunweinote002.name) #这句代码获取实例对象的属性值

# 类的属性继承
class YunweiNoteC(YunweiNoteB):    #subclass 继承 baseclass
    #继承基类时，基类的构造函数可直接.显示调用基类的构造方法
    #此时不重写基类的构造方法，实例调用时，就可以调用基类的构造函数
    #如果重写了子类的构造函数，但是依然还继承父类的方法，需要使用supper关键字
    def __init__(self,name,age):    
        YunweiNoteB.__init__(self,name)
        self.age = age
yunweinote003 = YunweiNoteC("yunweinote003",28)
print("name %s age is %d" %(yunweinote003.name,yunweinote003.age))

# 类的属性继承-重写构造方法
class YunweiNoteD(YunweiNoteB):
    def __init__(self,name,age): #subclass 重写了 baseclass 的构造方法
        self.name = name + name
        self.age = age
yunweinote004 = YunweiNoteD("yunweinote004",38)
print("name %s age is %d" %(yunweinote004.name,yunweinote004.age)) #从程序执行的结构看，实例的构造方法已经重写了，调用子类的构造方法

# 类的属性
class YunweiNoteE(object):
    def __init__(self,name):
        self.name = name

yunweinote004 = YunweiNoteE("yunweinote004")
print("name is %s" % yunweinote004.name)
yunweinote004.name = "yunweinote004a" # 外部代码能够修改实例值
print("name is %s" % yunweinote004.name)
#为了实现访问控制，需要定义属性为私有变量